package field

import (
	"strings"
	"yunj/pkg/yunj/core/builder"
	"yunj/pkg/yunj/core/builder/builderdto"
	"yunj/pkg/yunj/core/builder/form"
)

// 树-单选
type TreeRadio struct {
	form.Field
	Nodes                []*builderdto.FormTreeCheckNode `json:"nodes"`       // 节点（示例:[]*dto.FormTreeCheckNode{{Id:1,Name:"xiaowang",Pid:0,Nocheck:false,Checked:true},{Id:2,Name:"xiaoli",Pid:1}}）
	CloseLevel           uint                            `json:"closeLevel"`  // 收起等级（默认0不收起）
	LastChecked          bool                            `json:"lastChecked"` // 是否末级可选，反之所有可选
	activeNodeIdCommaStr string                          // 可选择的节点id逗号分割字符串
}

func NewTreeRadio(id string, title ...string) *TreeRadio {
	f := &TreeRadio{}
	form.SetFieldInstance(&f.Field, f)
	f.SetFieldId(id)
	if len(title) > 0 {
		f.SetTitle(title[0])
	}
	return f
}

// 设置标题
func (f *TreeRadio) SetTitle(title string) *TreeRadio {
	f.Title = title
	return f
}

// 设置默认值
func (f *TreeRadio) SetDefault(def any) *TreeRadio {
	f.Default = def
	return f
}

// 设置描述
func (f *TreeRadio) SetDesc(desc string) *TreeRadio {
	f.Desc = desc
	return f
}

// 设置验证规则
func (f *TreeRadio) SetVerify(rule string) *TreeRadio {
	f.Verify = rule
	return f
}

// 设置验证标题
func (f *TreeRadio) SetVerifyTitle(verifyTitle string) *TreeRadio {
	f.VerifyTitle = verifyTitle
	return f
}

// 增加验证规则
func (f *TreeRadio) AddVerify(rule string) *TreeRadio {
	f.AddFieldVerify(rule)
	return f
}

// 设置是否只读
func (f *TreeRadio) SetReadonly(yes bool) *TreeRadio {
	f.Readonly = yes
	return f
}

// 设置栅格布局
// 超小屏幕(手机<768px)、小屏幕(平板≥768px)、中等屏幕(桌面≥992px)、大型屏幕(桌面≥1200px)、超大屏幕(桌面≥1400px)
// 总列数：12
func (f *TreeRadio) SetGrid(num ...any) *TreeRadio {
	f.Grid = num
	return f
}

// 设置权限
func (f *TreeRadio) SetAuth(auth string) *TreeRadio {
	f.Auth = auth
	return f
}

// 设置节点
// 示例:[]*dto.FormTreeCheckNode{{Id:1,Name:"xiaowang",Pid:0,Nocheck:false,Checked:true},{Id:2,Name:"xiaoli",Pid:1}}
func (f *TreeRadio) SetNodes(nodes []*builderdto.FormTreeCheckNode) *TreeRadio {
	f.Nodes = nodes
	return f
}

// 收起等级（默认0不收起）
func (f *TreeRadio) SetCloseLevel(level uint) *TreeRadio {
	f.CloseLevel = level
	return f
}

// 是否末级可选，反之所有可选
func (f *TreeRadio) SetLastChecked(yes bool) *TreeRadio {
	f.LastChecked = yes
	return f
}

// 处理属性
func (f *TreeRadio) HandleAttr() error {
	// 处理节点
	err := f.HandleNodes()
	if err != nil {
		return f.SetError(err)
	}

	// Verify
	if !strings.Contains(f.Verify, "in") {
		if f.Verify == "" {
			f.Verify = "in:" + f.activeNodeIdCommaStr
		} else {
			f.Verify += "|in:" + f.activeNodeIdCommaStr
		}
	}

	return nil
}

// 处理节点
func (f *TreeRadio) HandleNodes() (err error) {
	activeNodeIdCommaStr, err := builder.HandleTreeCheckNodes(f.Nodes, f.LastChecked)
	if err != nil {
		return
	}
	f.activeNodeIdCommaStr = activeNodeIdCommaStr
	return
}
